package com.io.files;

import org.junit.Test;

import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;

/**
 * Files工具类的学习
 */
public class Files_ {
    public static void main(String[] args) {
        System.out.println("Files 工具类学习！");
    }

    @Test
    public void  path_() {
        // Paths 工具类
        // 构建 Path 对象
        // 方式一
        Path path = Paths.get("E:\\test", "com.txt");
        Path path2 = Paths.get("E:\\test");

        // File 和 Path 之间的转换
        // toPath() file转换成为 Path 对象
        // toFile() path 转换 FIle 对象
        File file = new File("E:\\test");
        Path path1 = file.toPath();
        File file1 = path1.toFile();

        // 创建文件 使用Files 集合 paths
        try {
            boolean exists = Files.exists(path);
            if (!exists) {
                // 不存在即创建文件
                Files.createFile(path);
                System.out.println("文件创建成功");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Test
    public void pathCommon() {
        // Path常见方法
        Path path = Paths.get("E:\\test", "com.txt");
        // 1.获取文件名
        Path fileName = path.getFileName();
        // 2.获取父路径
        Path parent = path.getParent();
        System.out.println(parent); // "E:\\test
        // 3.获取文件层数量
        int nameCount = path.getNameCount();
        System.out.println(nameCount); // 2
        // 4.获取指定层级文件（夹）名
        Path name = path.getName(1);
        System.out.println(name);
        // 5.获取绝对路径
        Path AbsolutePath = path.toAbsolutePath();
        System.out.println(AbsolutePath); // E:\test\com.txt
        // 获取绝对路径
        Path p = Paths.get("src", "a.txt");
        Path pk = p.toAbsolutePath();
        System.out.println(pk); // E:\JavaProject\java-learning-directory\CommonClass\src\a.txt
        // 获取绝对路径
        Path p2 = Paths.get("src\\com\\io\\files", "test.txt");
        Path pk2 = p2.toAbsolutePath();
        // E:\JavaProject\java-learning-directory\CommonClass\src\com\io\files\test.txt
        System.out.println(pk2);
    }

    @Test
    public void go() throws IOException {
        System.out.println("工具类的常规操作");
        String path = "E:\\test\\b.txt";
        // 1.按照byte[] 读取文件内容 byte[]
        byte[] bytes = Files.readAllBytes(Paths.get(path));
        // 使用 String 类 转换成为字符串类型
        String s = new String(bytes);
        //System.out.println(s);

        // 2.按照字符串类型来读取文件内容 Files.readString() 注意 JDK8 没有该方法 需要 JDK11
        System.out.println(Paths.get(path));
        // 3.按照行读取内容 Files.readAllLines(path, charset);  可以指定编码方式
        List<String> strings = Files.readAllLines(Paths.get(path));
        for (String string : strings) {
            System.out.println(string);
        }
    }

    @Test
    public void commonFilesMethod() throws IOException {
        // 常见Files类的方法
        String filePath = "E:\\test\\b.txt";
        String dirPath ="E:\\test";
        // 1.文件（夹）是否存在
        boolean exists = Files.exists(Paths.get(filePath));
        System.out.println(exists?"存在":"不存在");
        // 2.文件（夹）不存在
        boolean b = Files.notExists(Paths.get(dirPath));
        System.out.println(b?"是的，确实不存在":"存在");
        // 3.判断是否为文件夹
        boolean directory = Files.isDirectory(Paths.get(dirPath));
        System.out.println(directory?"是":"否");
        // 4.判断是否为文件
        boolean regularFile = Files.isRegularFile(Paths.get(filePath));
        System.out.println(regularFile);
        // 5.创建文件
        boolean exists1 = Files.exists(Paths.get(dirPath, "kkk.txt"));
        if (!exists1) {
            // 不存在即创建
            // 如果存在了，还执行 createFile 方法则会抛出异常 FileAlreadyExistsException
            Path file = Files.createFile(Paths.get(dirPath).resolve("kkk.txt"));
        }
        // 6.创建文件夹
        boolean work = Files.exists(Paths.get(dirPath, "work"));
        if (!work) {
            Path directory1 = Files.createDirectory(Paths.get(dirPath).resolve("work"));
        }
        // 7.创建多级文件夹
        boolean moreDir = Files.exists(Paths.get(dirPath, "xyz/zzz"));
        if (!moreDir) {
            Path directories = Files.createDirectories(Paths.get(dirPath).resolve("xyz/zzz"));
        }
        // 8.删除文件（夹）
        String del = dirPath+"\\work";
        Files.delete(Paths.get(del));
        // 9.存在即删除操作
        boolean b1 = Files.deleteIfExists(Paths.get(dirPath, "kkk.txt"));
        System.out.println(b1?"删除成功":"删除失败");
        // 10.文件夹复制
        Path copy = Files.copy(Paths.get(dirPath).resolve("a.txt"), Paths.get(dirPath).resolve("xxhaha.txt"));
        // 11.文件夹移动
        Path move = Files.move(Paths.get(dirPath, "read.txt"), Paths.get("E:\\", "read.txt"));
    }

    @Test
    public void readWriter() throws IOException {
        // 文件读写功能
        String dirPath ="E:\\test";
        Path path = Paths.get(dirPath, "mind.txt");
        // 如果不存在 即创建文件
        boolean exists = Files.exists(path);
        if (!exists) {
            // 创建文件
            Files.createFile(path);
            System.out.println("创建文件成功！");
        }
        // 1.写入字节数组 byte[]
        byte[] bytes = {'h','e','l','l','o'};
        Files.write(path, bytes);
        // 2.写入字符串类型的
        Files.write(path,Arrays.asList("line1","line2"));

        // 3.按照byte[] 读取文件内容 byte[]
        byte[] bs = Files.readAllBytes(path);
        // 使用 String 类 转换成为字符串类型
        String s = new String(bs);
        //System.out.println(s);
        // 4.按照字符串类型来读取文件内容 Files.readString() 注意 JDK8 没有该方法 需要 JDK11
        System.out.println(path);
        // 5.按照行读取内容 Files.readAllLines(path, charset);  可以指定编码方式
        List<String> strings = Files.readAllLines(path);
        for (String string : strings) {
            System.out.println(string);
        }
        // 6.获取 InputStream 对象
        InputStream inputStream = Files.newInputStream(path);
        // 7.获取 bufferedWriter 对象
        BufferedWriter bufferedWriter = Files.newBufferedWriter(path);
    }
}
